package main

import "fmt"

// 计算Modbus CRC16校验值
func Crc16(data []byte) uint16 {
	crc := uint16(0xFFFF)
	for _, b := range data {
		crc ^= uint16(b)
		for i := 0; i < 8; i++ {
			if crc&0x0001 != 0 {
				crc = (crc >> 1) ^ 0xA001
			} else {
				crc >>= 1
			}
		}
	}
	return crc
}

// 添加报文并且485
func AddSendCrc(dataToSend []byte) []byte {
	// dataToSend := []byte{0x01, 0x03, 0x00, 0x00, 0x00, 0x20} // 原始数据（去掉末尾2字节校验位）
	crc := Crc16(dataToSend)

	// 小端序：低字节在前，高字节在后
	lsb := byte(crc & 0xFF)
	msb := byte(crc >> 8)

	// fmt.Printf("原始数据: % X\n", dataToSend)
	// fmt.Printf("计算出的校验位: %02X %02X\n", lsb, msb)
	dataToSend = append(dataToSend, lsb, msb)
	// fmt.Printf("完整报文: % X\n", dataToSend)
	return dataToSend
}

func main() {
	fmt.Println("main.go")
	var addr uint8
	addr = 0x01;
	for i := 0;i < 10;i++ {
		fmt.Println("------- for i  -------")
		sendData := []byte{addr, 0x03, 0x00, 0x00, 0x00, 0x02}
		realData := AddSendCrc(sendData)
		fmt.Printf("\t addr : %d realData: % X \n", addr, realData)
		addr++;
	}
	
}